package com.webauto.selenium;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Cookie;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;

import com.webauto.log.Log;
import com.webauto.test_case.BaseCase;

/**
 * PS:窗口操作工具类
 * @author lkk
 *
 */
public class ManagerUtil {
	//隐式等待时间
	private static final int IMPLICITLYWAITTIME = 30;
	//页面等待时间
	private static final int PAGELOADTIME = 30;
	
	/**
	 * PS:浏览器最大化
	 * 
	 */
	public static void maximize() {
		try {
			BaseCase.driver.manage().window().maximize();
		}catch(Exception e) {
			Log.error("+++浏览器最大化异常+++");
		}
	}
	
	/**
	 * PS:设置浏览器宽高
	 * @param x 宽度
	 * @param y 高度
	 */
	public static void setBrowserSize(int x,int y) {
		try {
			//创建空间对象
			Dimension dimension = new Dimension(x, y);
			//为浏览器设置宽高
			BaseCase.driver.manage().window().setSize(dimension);
		}catch(Exception e) {
			Log.error("+++浏览器设置宽高异常+++");
		}
	}
	
	/**
	 * PS:获取浏览器当前宽度
	 * @return 宽度值
	 */
	public static int getBrowserWidth() {
		int width = 0;
		try {
			//获取空间对象
			Dimension dimension = BaseCase.driver.manage().window().getSize();
			//获取高度
			width = dimension.getWidth();
		}catch(Exception e) {
			Log.error("+++获取浏览器宽度异常+++");
		}
		return width;
	}
	
	/**
	 * PS:获取浏览器当前高度
	 * @return 高度值
	 */
	public static int getBrowserHeight() {
		int height = 0;
		try {
			//获取空间对象
			Dimension dimension = BaseCase.driver.manage().window().getSize();
			//获取高度
			height = dimension.getHeight();
		}catch(Exception e) {
			Log.error("+++获取浏览器高度异常+++");
		}
		return height;
	}
	
	/**
	 * PS:隐式等待
	 */
	public static void implicitlyWait() {
		try{
			BaseCase.driver.manage().timeouts().implicitlyWait(IMPLICITLYWAITTIME, TimeUnit.SECONDS);
		}catch(Exception e) {
			Log.error("+++隐式等待超时异常+++");
		}
	}
	
	/**
	 * PS:隐式等待指定时间
	 * @param time 时间(s)
	 */
	public static void implicitlyWait(int time) {
		try{
			BaseCase.driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS);
		}catch(Exception e) {
			Log.error("+++隐式等待超时异常+++");
		}
	}
	/**
	 * PS:页面加载等待
	 */
	public static void pageLoadTimeout() {
		try{
			BaseCase.driver.manage().timeouts().pageLoadTimeout(PAGELOADTIME, TimeUnit.SECONDS);
		}catch(Exception e) {
			Log.error("+++页面加载超时异常,等待时长:"+PAGELOADTIME+"秒+++");
		}
	}
	
	/**
	 * PS:页面加载等待指定的时间
	 * @param time 指定时间(s)
	 */
	public static void pageLoadTimeout(int time) {
		try{
			BaseCase.driver.manage().timeouts().pageLoadTimeout(time, TimeUnit.SECONDS);
		}catch(Exception e) {
			Log.error("+++页面加载超时异常,等待时长:"+time+"秒+++");
		}
	}
	
	/**
	 * PS:执行js代码
	 * @param js js代码
	 * @return 结果对象
	 */
	public static Object executeScript(String js) {
		Object result = null;
		try{
			//获取js执行对象
			JavascriptExecutor javascriptExecutor= (JavascriptExecutor)BaseCase.driver;
			//执行js代码,获取结果对象
			result = javascriptExecutor.executeScript(js);
		}catch(Exception e) {
			Log.error("+++执行js代码异常,js:"+js+"+++");
		}
		return result;
	}
	
	/**
	 * PS:执行需要js的代码操作指定元素
	 * @param js js字符串
	 * @param webElement 操作元素
	 * @return 结果对象
	 */
	public static Object executeScript(String js,WebElement webElement) {
		Object result = null;
		try{
			//获取js执行对象
			JavascriptExecutor javascriptExecutor= (JavascriptExecutor)BaseCase.driver;
			//执行js代码,获取结果对象
			result = javascriptExecutor.executeScript(js,webElement);
		}catch(Exception e) {
			Log.error("+++执行js代码异常,js:"+js+"+++");
		}
		return result;
	}
	/**
	 * PS:根据cookieName获取cookieValue
	 * @param cookieName cookie名
	 * @return cookie值
	 */
	public static String getCookieValueByName(String cookieName) {
		String cookieValue = null;
		try{
			//获取cookie对象
			Cookie cookie = BaseCase.driver.manage().getCookieNamed(cookieName);
			//获取cookie内容
			cookieValue = cookie.getValue();
		}catch(Exception e) {
			Log.error("+++获取cookie值异常,cookieName:"+cookieName+"+++");
		}
		return  cookieValue;
	}
	
	/**
	 * PS:线程等待
	 * @param 等待时长(毫秒)
	 */
	public static void sleep(long millis) {
		try {
			Thread.sleep(millis);
		} catch (InterruptedException e) {
			Log.error("+++线程等待异常+++");
		}
	}
}
